﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects.DataClasses;
using MySql.Data.MySqlClient;

namespace ModeloGaleriaNET
{
    public partial class Usuario : EntityObject
    {
        #region Propiedades derivadas
        public bool EsAdministrador
        {
            get { return this is Administrador; }
        }
        public string NombreCompleto
        {
            get { return this.Nombre + " " + this.Apellido1 + " " + this.Apellido2; }
        }
        #endregion
    }

    public partial class Auditoria : EntityObject
    {
        #region Propiedades derivadas
        public string UsuarioNombre
        {
            get { return this.Usuarios == null ? string.Empty : this.Usuarios.PseudonimoLocal; }
        }

        public string TipoNombre
        {
            get { return this.TiposAuditoria.Nombre; }
        }

        public string FechaRealizacionString
        {
            get 
            {
                string zona = this.ZonasHorarias.DisplayName.Split(new char[] { ' ' })[0];
                return String.Format("{0:dd MMMM yyyy, HH:mm:ss}; ", 
                TimeZoneInfo.ConvertTimeFromUtc(this.Fecha, TimeZoneInfo.FindSystemTimeZoneById(this.ZonasHorarias.StandardName)))
                + zona; 
            }
        }

        public string FechaLocalString
        {
            get
            {
                string zona = TimeZoneInfo.Local.DisplayName.Split(new char[] { ' ' })[0];
                return String.Format("{0:dd MMMM yyyy, HH:mm:ss}; ", 
                TimeZoneInfo.ConvertTimeFromUtc(this.Fecha, TimeZoneInfo.Local)) + zona; 
            }
        }
        #endregion
    }

    public partial class Cliente : EntityObject
    {
        #region Propiedades derivadas
        public string NombrePais
        {
            get { return this.Paises.Espanol; }
        }
        public string NombreCompleto
        {
            get { return this.Nombre + " " + this.Apellido1 + " " + this.Apellido2; }
        }
        public string ApellidosNombre
        {
            get 
            {
                if (string.IsNullOrWhiteSpace(this.Apellido1) && string.IsNullOrWhiteSpace(this.Apellido2))
                    return this.Nombre;
                return this.Apellido1 + " " + this.Apellido2 + ", " + this.Nombre; 
            }
        }
        public string NombreUsuarioAlta
        {
            get { return this.Usuarios == null ? "" : this.Usuarios.PseudonimoLocal; }
        }
        public List<ClientesPropietariosObras> ObrasEnPropiedad
        {
            get 
            {
                List<ClientesPropietariosObras> obras;
                obras = this.ClientesPropietariosObras.Where(cpo => cpo.FechaInicio < DateTime.Now && cpo.FechaFin == null).ToList();
                return obras == null || obras.Count == 0 ? null : obras;
            }
        }
        #endregion
    }

    public partial class Obra : EntityObject
    {
        #region Propiedades derivadas
        public string NombrePropietarioActual
        {
            get 
            {
                List<ClientesPropietariosObras> propietarios;
                propietarios = this.ClientesPropietariosObras.Where(cpo => cpo.FechaInicio <= DateTime.Now && cpo.FechaFin == null).ToList();
                return propietarios == null || propietarios.Count == 0 ? string.Empty : propietarios.First().Clientes.ApellidosNombre;
            }
        }
        public int IdPropietarioActual
        {
            get
            {
                List<ClientesPropietariosObras> propietarios;
                propietarios = this.ClientesPropietariosObras.Where(cpo => cpo.FechaInicio <= DateTime.Now && cpo.FechaFin == null).ToList();
                return propietarios == null || propietarios.Count == 0 ? -1 : propietarios.First().Clientes.Id;
            }
        }
        public string NombreUsuarioAlta
        {
            get { return this.Usuarios == null ? "" : this.Usuarios.PseudonimoLocal; }
        }
        public List<ClientesPropietariosObras> PropietariosAnteriores
        {
            get
            {
                List<ClientesPropietariosObras> propietarios;
                propietarios = this.ClientesPropietariosObras.Where(cpo => cpo.FechaInicio < DateTime.UtcNow && (cpo.FechaFin != null && cpo.FechaFin <= DateTime.Now)).ToList();
                return propietarios == null || propietarios.Count == 0 ? null : propietarios;
            }
        }
        public ClientesPropietariosObras ClientePropietarioObraActual
        {
            get
            {
                List<ClientesPropietariosObras> propietarios;
                propietarios = this.ClientesPropietariosObras.Where(cpo => cpo.FechaInicio < DateTime.UtcNow && (cpo.FechaFin == null)).ToList();
                return propietarios == null || propietarios.Count == 0 ? null : propietarios.First();
            }
        }
        public string AnyoFormato
        {
            get { return this.Anyo < 0 ? this.Anyo.ToString().Replace("-", "") + " a. C" : this.Anyo.ToString() + " d. C"; }
        }
        public string NombreAutor
        {
            get
            {
                if (string.IsNullOrWhiteSpace(this.Autor))
                    return this.Nombre;
                return this.Nombre + ", " + this.Autor; 
            }
        }
        #endregion
    }

    public partial class Subasta : EntityObject
    {
        #region Métodos nuevos
        public void ChangeState(EstadoSubasta estado)
        {
            SubastaHasEstadoSubasta antiguo, nuevo;
            int zona;

            zona = Utilities.GetZonaHoraria();
            if (this.EstadoActual != null)
            {
                // Finalizamos el estado actual
                antiguo = this.SubastaHasEstadosSubasta.Where(shs => shs.FechaFin == null).First();
                antiguo.FechaFin = DateTime.UtcNow;
                antiguo.zonaFechaFin = zona;
            }

            // Creamos el nuevo
            nuevo = new SubastaHasEstadoSubasta();
            nuevo.Subasta = this.Id;
            nuevo.FechaInicio = DateTime.UtcNow;
            nuevo.zonaFechaInicio = zona;
            nuevo.EstadosSubasta = estado;
        }
        #endregion

        #region Propiedades derivadas
        public string Propietario
        {
            get { return this is SubastaDeOtro ? ((SubastaDeOtro)this).Autor : ServerConnData.Instance.User; }
        }

        public string MppAsString
        {
            get
            {
                if (this.MaximoPujasPostor == Int32.MaxValue)
                    return "No establecido";
                return this.MaximoPujasPostor.ToString();
            }
        }
        public string TematicasAsString
        {
            get
            {
                string salida = string.Empty;
                List<Tematica> tematicas = this.Tematicas.ToList();
                if (tematicas != null && tematicas.Count > 0)
                {
                    salida = tematicas[0].Nombre;
                    for (int i = 1; i < tematicas.Count; i++)
                        salida += ", " + tematicas[i].Nombre;
                }
                return salida;
            }
        }

        public bool IsSubastaPropia
        {
            get { return (this is SubastaDeOtro == false); }
        }

        public ClientesPropietariosObras ClientesPropietariosObrasTipoCorregido
        {
            get { return IsSubastaPropia ? this.ClientesPropietariosObras : null; }
            set
            {
                if (!IsSubastaPropia)
                    throw new WrongTypeSubastaException("No se puede establecer esta propiedad para este tipo de subasta");
                this.ClientesPropietariosObras = value;
            }
        }

        public string FechaLimiteLocalAsString
        {
            get 
            {
                string zona = TimeZoneInfo.Local.DisplayName.Split(new char[] { ' ' })[0];
                return String.Format("{0:dd MMMM yyyy, HH:mm:ss}; ",
                TimeZoneInfo.ConvertTimeFromUtc(this.FechaLimite, TimeZoneInfo.Local)) + zona;  
            }
        }

        public string FechaInicioLocalAsString
        {
            get 
            {
                string zona = TimeZoneInfo.Local.DisplayName.Split(new char[] { ' ' })[0];
                return String.Format("{0:dd MMMM yyyy, HH:mm:ss}; ",
                TimeZoneInfo.ConvertTimeFromUtc(this.FechaInicio, TimeZoneInfo.Local)) + zona;  
            }
        }

        public string AnyoFormatoObra
        {
            get { return this.AnyoObra < 0 ? this.AnyoObra.ToString().Replace("-", "") + " a. C" : this.AnyoObra.ToString() + " d. C"; }
        }

        public string NegociadoAsString
        {
            get
            {
                switch (this.TipoNegociado)
                {
                    case "manual":
                        return "Manual";
                    case "automatico":
                        return "Automático";
                    default:
                        return string.Empty;
                }
            }
        }

        public string EstadoObraAsString
        {
            get
            {
                switch (this.EstadoObra)
                {
                    case "deteriorado":
                        return "Deteriorado";
                    case "original":
                        return "Original";
                    case "restaurado":
                        return "Restaurado";
                    default:
                        return string.Empty;
                }
            }
        }
        public EstadoSubasta EstadoActual
        {
            get
            {
                IEnumerable<SubastaHasEstadoSubasta> estados;
                estados = this.SubastaHasEstadosSubasta.Where(shes => shes.FechaInicio <= DateTime.UtcNow && shes.FechaFin == null);
                return estados == null || estados.Count() == 0 ? null : estados.First().EstadosSubasta;
            }
        }
        public string EstadoAsString
        {
            get
            {
                try
                {
                    switch (this.EstadoActual.Estado)
                    {
                        case "creada":
                            return "Creada";
                        case "publicada":
                            return "Publicada";
                        case "activa":
                            return "Activa";
                        case "finalizada":
                            return "Finalizada";
                        case "confirmada":
                            return "Confirmada";
                        case "cancelada":
                            return "Cancelada";
                        default:
                            return string.Empty;
                    }
                }
                catch (Exception)
                {
                    return string.Empty;
                }
            }
        }
        #endregion
    }

    public partial class ClientesPropietariosObras : EntityObject
    {
        #region Propiedades derivadas
        public Subasta SubastaActual
        {
            get
            {
                IEnumerable<Subasta> subastas = this.Subastas.Where(s => s.EstadoActual.Estado == "creada" || s.EstadoActual.Estado == "publicada" || s.EstadoActual.Estado == "activa");
                return subastas == null || subastas.Count() == 0 ? null : subastas.First();
            }
        }

        public List<Subasta> SubastasPropias
        {
            get { return this.Subastas.Where(s => s.IsSubastaPropia).ToList(); }
        }

        public string NombreCliente
        {
            get
            {
                if (this.Clientes != null)
                    return this.Clientes.ApellidosNombre;
                return string.Empty;
            }
        }
        public string NombreObra
        {
            get
            {
                if (this.Obras != null)
                    return this.Obras.Nombre;
                return string.Empty;
            }
        }
        public string AutorObra
        {
            get
            {
                if (this.Obras != null)
                    return this.Obras.Autor;
                return string.Empty;
            }
        }
        public string FechaCompra
        {
            get 
            {
                string zona = TimeZoneInfo.Local.DisplayName.Split(new char[] { ' ' })[0];
                return String.Format("{0:dd MMMM yyyy, HH:mm:ss}; ",
                TimeZoneInfo.ConvertTimeFromUtc(this.FechaInicio, TimeZoneInfo.Local)) + zona; 
            }
        }
        public string FechaVenta
        {
            get
            {
                string zona;

                if (this.FechaFin == null)
                    return string.Empty;
                else
                {
                    zona = TimeZoneInfo.Local.DisplayName.Split(new char[] { ' ' })[0];
                    return String.Format("{0:dd MMMM yyyy, HH:mm:ss}; ",
                    TimeZoneInfo.ConvertTimeFromUtc(this.FechaFin.Value, TimeZoneInfo.Local)) + zona;
                }
            }
        }
        #endregion
    }

    public partial class Puja: EntityObject
    {
        public string FechaAsString
        {
            get 
            {
                string zona = TimeZoneInfo.Local.DisplayName.Split(new char[] { ' ' })[0];
                return String.Format("{0:dd MMMM yyyy, HH:mm:ss}; ",
                TimeZoneInfo.ConvertTimeFromUtc(this.Fecha, TimeZoneInfo.Local)) + zona; 
            }
        }

        public string CantidadAsString
        {
            get { return this.Cantidad + " €"; }
        }
    }
}
